package com.gta.edu.sdk.config.datasource;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.gta.edu.sdk.util.StringUtil;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
public class DBDecode {
	private static final Logger log = LogManager.getLogger(DBDecode.class);
	private static String DEFAULT_SM4_SECRET_KEY;
	
	static {
		Properties prop = new Properties();
		try {
			prop.load(DBDecode.class.getClassLoader().getResourceAsStream("log_transfer_config.properties"));
			DEFAULT_SM4_SECRET_KEY = prop.getProperty("SM4_SECRET_KEY");
		} catch (IOException e) {
			log.error("读取配置文件出现了异常，请检查配置信息！",e);
		}
	}
	
	/**
     * SM3加密
     * @param data 需要加密的字符串
     * @return 返回加密后的字符串
     */
    private static String toSM3Str(String data) {
        return SmUtil.sm3(data);
    }
    
    /**
     * SM4加密
     * @param data 加密数据
     * @return 加密后的数据
     */
    private static String toSM4Str(String data) {
    	 SymmetricCrypto sm4 = SmUtil.sm4(DEFAULT_SM4_SECRET_KEY.getBytes());
         return sm4.encryptHex(data);
    }
    
    /**
     * SM4解密
     * @param data 密文数据
     * @return 解密后的数据
     */
    private static String parseSM4Str(String data) {
    	SymmetricCrypto sm4 = SmUtil.sm4(DEFAULT_SM4_SECRET_KEY.getBytes());
        return sm4.decryptStr(data, CharsetUtil.CHARSET_UTF_8);
    }
    
    /**
     * @param string 明文
     * @return 加密后的密文
     */
    public static String encryptionDecode(String pa){
    	if (StringUtil.isNullOrEmpty(pa)) {
    		return "";
    	}
		String sm3Pa = toSM3Str(pa);
		String sm4Context = pa + "_" + sm3Pa;
		String sm4Pa = toSM4Str(sm4Context);
		return sm4Pa;
    }
    
    /**
     * @param string 密文
     * @return 解密后的明文
     */
    public static String decryptDecode(String pa) {
    	if (StringUtil.isNullOrEmpty(pa)) {
    		return "";
    	}
    	String sm4Context = parseSM4Str(pa);
    	String[] pas = sm4Context.split("_");
    	if (pas.length == 2) {
    		String sm3Pa = toSM3Str(pas[0]);
    		if (sm3Pa != null && sm3Pa.equals(pas[1])) {
    			return pas[0];
    		}
    	}
    	return null;
    }
    
//    public static void main(String[] args) {
//		String pa = "AHdl@2020";
//		String ps = encryptionDecode(pa);
//		String pss = decryptDecode(ps);
//		System.out.println("pss=" + pss);
//	}

	public static void main(String[] args) {
		System.out.println("****************************************请输入密码*************************");
		BufferedReader br = null;
		try {
			br = new BufferedReader(new InputStreamReader(System.in));
			String line = null;
			while(StringUtil.isNullOrEmpty(line = br.readLine())) {
				System.out.println("输入的数据不能为空！");
			}
			String encodeStr = encryptionDecode(line);
			System.out.println("加密后的数据是：" + encodeStr);
			System.out.println("数据解密是：" + decryptDecode(encodeStr));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	
//	 /**
//     * 进行加密
//     * @param string
//     * @param key
//     * @return
//     */
//    public static String encryptionDecode(String string){
//        SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(key), "DES");//恢复密钥
//        Cipher cipher = null;//Cipher完成加密或解密工作类
//        try {
//            cipher = Cipher.getInstance("DES");
//        } catch (NoSuchAlgorithmException e) {
//            e.printStackTrace();
//        } catch (NoSuchPaddingException e) {
//            e.printStackTrace();
//        }
//        try {
//            cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化，加密模式
//        } catch (InvalidKeyException e) {
//            e.printStackTrace();
//        }
//        byte[] cipherByte = null;
//        try {
//            cipherByte = cipher.doFinal(string.getBytes());//加密data
//        } catch (IllegalBlockSizeException e) {
//            e.printStackTrace();
//        } catch (BadPaddingException e) {
//            e.printStackTrace();
//        }
//        return Base64.getEncoder().encodeToString(cipherByte);
//    }
//    
//    /**
//     * 进行解密
//     * @param string
//     * @param key
//     * @return
//     */
//    public static String decryptDecode(String string){
//        SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(key), "DES");//恢复密钥
//        Cipher cipher = null;//Cipher完成加密或解密工作类
//        try {
//            cipher = Cipher.getInstance("DES");
//        } catch (NoSuchAlgorithmException e) {
//            e.printStackTrace();
//        } catch (NoSuchPaddingException e) {
//            e.printStackTrace();
//        }
//        try {
//            cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化，解密模式
//        } catch (InvalidKeyException e) {
//            e.printStackTrace();
//        }
//        byte[] cipherByte = new byte[0];//解密data
//        try {
//            cipherByte = cipher.doFinal(Base64.getDecoder().decode(string));
//        } catch (IllegalBlockSizeException e) {
//            e.printStackTrace();
//        } catch (BadPaddingException e) {
//            e.printStackTrace();
//        }
//        return new String(cipherByte);
//    }

}
